#ifndef D17A7E92_5B46_4391_A6D2_D280FDF0AFE7
#define D17A7E92_5B46_4391_A6D2_D280FDF0AFE7

#include<iostream>
#include<ctime>
#include<string>
#include<sys/stat.h>

namespace mian_yang
{
    //实用工具类的设计
    namespace util
    {
        //获取时间的工具
        class Date
        {
        public:
            static time_t getTime()  //返回的是time_t类型的时间戳
            {
                return time(nullptr);
            }
        };
        
        //创建文件的工具
        class File
        {
        public:
            static bool exists(const std::string& pathname)
            {
                struct stat st;    //遵循posix标准
                if (stat(pathname.c_str(), &st) < 0)
                {
                    return false;
                }
                return true;
            }
            
            //获取文件的路径（就是不包含文件名）
            static std::string path(const std::string& pathname)
            {
                //ab/cb/a
                int pos = pathname.find_last_of("/\\");  //两个斜杠都寻找一下，是为了支持windows
                if (pos == std::string::npos)
                {
                    return ".";   //没有找到， 说明只有一个文件名， 那么就只能返回一个.
                }
                else
                {
                    return pathname.substr(0, pos + 1);
                }
            }

            //创建目录,必须一层一层创建。 比如
            static void createDirectory(const std::string& pathname)
            {
                //假如./ab/bc/cd/a
                int index = 0;
                int n = pathname.size();
                while (index < n)
                {
                    //从index的位置开始找,这个是找父级目录， 如果没找到父级目录， 那么就说明
                    //已经到了最后一个文件了， 这个时候不用再找了， 直接把文件创建了就行。
                    int pos = pathname.find_first_of("/\\", index); 
                    if (pos == std::string::npos)
                    {
                        mkdir(pathname.c_str(), 0777);
                        return;
                    }
                    //到这里说明还有父级目录， 那么就要判断父级目录是否存在了,因为是文件， 
                    //所以要判断到父级目录的整个路径是否存在。 所以截取字符串从0截取， 一直截取到pos位置
                    std::string parentpath = pathname.substr(0, pos + 1); 
                    if (exists(parentpath))
                    {
                        //存在父级目录，不需要创建.
                        index = pos + 1;
                    } 
                    else
                    {
                        //不存在父级目录， 需要创建
                        mkdir(parentpath.c_str(), 0777);
                        index = pos + 1;
                    }
                }
            }
        };

        void TestUtil()
        {
            std::cout << mian_yang::util::Date::getTime() << std::endl;
            mian_yang::util::File newfile;
            std::string pathname = "./new/file/sdf";
            std::cout << newfile.path(pathname) << std::endl;
            std::cout << newfile.exists(pathname) << std::endl;
            std::cout << pathname << std::endl;
            newfile.createDirectory(pathname);
            std::cout << newfile.exists(pathname) << std::endl;
        }
    }
}



#endif /* D17A7E92_5B46_4391_A6D2_D280FDF0AFE7 */
